/********************************************************************
*                                                                   *
* Microsoft Windows Sidebar Gadget for NNTT.ORG                     *
* Released under the MIT license by Alexey Glukharev, Januar 2012.  *
*                                                                   *
********************************************************************/

//----------------------------------------
// CTorrentInfo class
//----

// Constructor
CTorrentInfo = function (container, dataProvider, error) {
    var self = this;
    self.g_data =[];
    
    // Сохраняем параметры конструктора
    self.g_container = container;
    self.g_dataProvider = dataProvider;
    self.g_error = error;
    
    // Длинна оси Х в пикселях
    self.g_xAxisLength = 150;
    
    // Период обновления данных графика
    // В секундах
    self.g_dataUpdatePeriod = Settings().get('statisticPeriod') / self.g_xAxisLength;
    
    // Вешаем обработчик ошибок получения данных от провайдера
    self.g_dataProvider.g_options.error = function () {
        // Будем пытаться подключиться к клиенту с некоторой периодичностью
        setTimeout(function () {
            self.update(self);
        },
        5000);
        
        // Уведомим основной поток
        self.g_error();
    }
    
    // Инициируем запуск таймера
    self.update(self);
    return self;
};

// Methodes
CTorrentInfo.prototype = {
    update: function (self) {
        self.g_dataProvider.getData(function (data) {
            
            // Если контейнер ещё не инициализирован
            // (или уже удалён при ошибке), создадим новый
            if (! $("#placeholder").length) {
                self.initContainer();
            }
            
            // Обновим легенду
            $("#legend-down-speed").text(getSizeString(data.down, true, false));
            $("#legend-down-speed-dim").text(getSizeString(data.down, false, true) + "/s");
            $("#legend-up-speed").text(getSizeString(data.up, true, false));
            $("#legend-up-speed-dim").text(getSizeString(data.up, false, true) + "/s");
            
            // Удаляем последний элемент очереди, если достигли максимальной длины
            if (self.g_data.length > self.g_xAxisLength) {
                self.g_data = self.g_data.slice(1);
            }
            
            // Пополняем очередь
            self.g_data.push(data);
            
            // Строим массив данных [x, y]
            var resDown =[];
            var resUp =[];
            for (var i = 0; i < self.g_data.length; i++) {
                resDown.push([i, self.g_data[i].down]);
                resUp.push([i, self.g_data[i].up]);
            }
            
            // Задание данных отрисовки
            self.plot.setData([ {
                color: "#800000",
                label: "down",
                data: resDown
            },
            {
                color: "#006600",
                label: "up",
                data: resUp
            }]);
            
            // Непосредственно рисование
            self.plot.setupGrid();
            self.plot.draw();
            
            // Запустим таймер повторной отрисовки
            setTimeout(function () {
                self.update(self)
            },
            self.g_dataUpdatePeriod * 1000);
        });
    },
    initContainer: function () {
        var self = this;
        
        // Очистим контейнер (возможно там отображается сообщение об ошибке)
        // и обнулим буффер данных, чтобы не показывать статистику предыдущей сессии
        self.g_data =[];
        $(self.g_container).find("*").remove();
        
        // Setup plot
        var options = {
            series: {
                shadowSize: 0,// drawing is faster without shadows
                lines: {
                    lineWidth: 1.0
                }
            },
            yaxis: {
                min: 0,
                ticks: function (axis) {
                    var res =[];
                    
                    // Возьмём максимум немного большим, чтобы график лучше смотрелся
                    var max = axis.max * 1.15;
                    
                    // Размер шага рассчитываем так, чтобы он был кратен 2
                    var step = (max - axis.min) * 0.25;
                    
                    // Заполним массив отметок
                    var lastTick = axis.min;
                    while (lastTick < max) {
                        res.push(lastTick);
                        lastTick += step;
                    }
                    
                    // Не забудем указать верхнюю границу - она не попала в массив в цикле
                    res.push(max);
                    return res;
                },
                tickFormatter: function (val, axis) {
                    if (val == axis.min) {
                        return axis.min;
                    }
                    
                    if (val > axis.max) {
                        // Только размерность
                        return getSizeString(axis.max, false, true) + "/s";
                    }
                    
                    // Определим максимум размерности и получим текущее значение
                    var pow = getSizePow(axis.datamax);
                    var tmp = val / Math.pow(1024, pow);
                    var ret = tmp.toFixed(2);
                    
                    // Удалим незначащие нули в конце (и точку, если потребуется)
                    ret = ret.rtrim("0");
                    if (ret.charAt(ret.length - 1) == ".") {
                        ret = ret.substr(0, ret.length - 1);
                    }
                    
                    return ret;
                },
                labelWidth: 30,
                labelHeight: 12,
                reserveSpace: true,
                color: "#666666"
            },
            xaxis: {
                ticks: function (axis) {
                    var res =[];
                    var step = (axis.max - axis.min) * 0.25;
                    
                    // Заполним массив отметок
                    var lastTick = axis.min;
                    while (lastTick < axis.max) {
                        res.push(lastTick);
                        lastTick += step;
                    }
                    
                    // Не забудем указать верхнюю границу - она не попала в массив в цикле
                    res.push(axis.max);
                    return res;
                },
                tickFormatter: function (val, axis) {
                    var p = Settings().get('statisticPeriod');
                    var step = p / axis.max;
                    
                    var dim = "";
                    var v = 0;
                    
                    if (p <= 60) {
                        dim = "secDim";
                        v = val * step;
                    } else {
                        if (p <= 3600) {
                            dim = "minDim";
                            v = val * step / 60;
                        } else {
                            dim = "hourDim";
                            v = val * step / 3600;
                        }
                    }
                    
                    if (val >= axis.max) {
                        return v + " " + strings[dim];
                    }
                    
                    // Удалим незначащие нули в конце (и точку, если потребуется)
                    v = v.toFixed(2);
                    v = v.rtrim("0");
                    if (v.charAt(v.length - 1) == ".") {
                        v = v.substr(0, v.length - 1);
                    }
                    
                    return v;
                },
                min: 0,
                max: self.g_xAxisLength,
                labelHeight: 12,
                reserveSpace: true,
                color: "#666666"
            },
            legend: {
                show: false
            },
            grid: {
                show: true,
                borderWidth: 0
            }
        };
        
        var legend = $("<div>", {
            id: "legend",
            css: {
                width: 30,
                float: "right"
            },
            html:
            "<span class='legend-down bold'>Down</span><br/>" +
            "<span id='legend-down-speed' class='legend-down'></span><br/>" +
            "<span id='legend-down-speed-dim' class='legend-down'></span><br/><br/>" +
            "<span class='legend-up bold'>Up</span><br/>" +
            "<span id='legend-up-speed' class='legend-up'></span><br/>" +
            "<span id='legend-up-speed-dim' class='legend-up'></span>"
        })
        .appendTo(self.g_container);
        
        // Создаём наполнение контейнера: собственно график и легенду
        var placeholder = $("<div>", {
            id: "placeholder",
            css: {
                width: $(self.g_container).width() - 35,
                height: $(self.g_container).height() - 7,
                marginRight: 30,
                marginTop: 5,
                fontSize: 13,
                fontFamily: 'Tahoma, sans-serif',
                fontStyle: 'normal'
            }
        })
        .appendTo(self.g_container);
        
        // Создаём объект графика
        self.plot = $.plot($(placeholder),[self.g_data], options);
        self.plot.setupGrid();
        self.plot.draw();
    }
};